package db

import (
	mydb "filestore-server/db/mysql"
	"log"
)

// UserSignup 用户注册
func UserSignup(username string, passwd string) bool {
	stmt, err := mydb.DBConn().Prepare(`insert into tbl_user (user_name, user_pwd) values (?, ?)`)
	if err != nil {
		log.Fatalf("SQL预编译出错！err:%s", err)
		return false
	}
	defer stmt.Close()

	ret, err := stmt.Exec(username, passwd)
	if err != nil {
		log.Fatalf("SQL执行失败！err:%v", err)
		return false
	}
	if rowsAffected, err := ret.RowsAffected(); nil == err && rowsAffected > 0 {
		return true
	}

	return false
}

// UserSignin 用户登陆
func UserSignin(username string, encpwd string) bool {
	stmt, err := mydb.DBConn().Prepare(`select * from tbl_user where user_name =? limit 1`)
	if err != nil {
		log.Fatalf("SQL预编译失败！err:%v", err)
		return false
	}

	rows, err := stmt.Query(username)
	if err != nil {
		log.Fatalf("SQL执行失败！err:%v", err)
		return false
	} else if rows == nil {
		log.Fatalf("未找到，数据不存在！err:", err)
		return false
	}

	pRows := mydb.ParseRows(rows)
	log.Printf("用户名称：%s, 获取到的数据：%s", username, pRows)
	// 判断密码是否正确
	if len(pRows) > 0 && string(pRows[0]["user_pwd"].([]byte)) == encpwd{
		return true
	}

	return false

}

// UploadToken 刷新Token
func UploadToken(username string, token string) bool {
	// replace into函数
	// replace具备替换拥有唯一索引或者主键索引重复数据的能力，也就是如果使用replace into插入的数据的唯一索引或者主键索引与之前的数据有重复的情况，将会删除原先的数据，然后再进行添加。
	// 语法：replace into table( col1, col2, col3 ) values ( val1, val2, val3 )
	// 语义：向table表中col1, col2, col3列replace数据val1，val2，val3

	// 这里使用 replace into 的原因是，可能这个username已经有了一个对应的 token ，但是插入的时候不知道，就只用 replace into

	stmt, err := mydb.DBConn().Prepare(`replace into tbl_user_token (user_name, user_token) values (?, ?)`)
	if err != nil {
		log.Fatalf("SQL预编译失败！err:%v", err)
		return false
	}
	defer stmt.Close()

	_, err = stmt.Exec(username, token)
	if err != nil {
		log.Fatalf("SQL执行失败！err:%v", err)
		return false
	}

	return true

}

type User struct {
	Username string // 用户名
	Email string // 邮箱
	Phone string // 手机号
	SignupAt string // 注册时间
	LastActiveAt string // 最后在线时间
	Status int // 状态
}

// GetUserInfo 获取用户信息
func GetUserInfo(username string) (*User, error) {
	user := &User{}
	stmt, err := mydb.DBConn().Prepare(`select user_name, signup_at from tbl_user where user_name =? limit 1`)
	if err != nil {
		log.Fatalf("SQL编译失败！err:%v", err)
		return nil, err
	}
	defer stmt.Close()

	// 执行查询操作
	// Scan 这里必须是指针获取值 &
	err = stmt.QueryRow(username).Scan(&user.Username, &user.SignupAt)
	if err != nil {
		log.Fatalf("SQL执行失败！err:%v", err)
		return nil, err
	}

	return user, nil
}
